#include "customer_controller.h"
#include "string.h"
#include "bsp_usart.h"
#include "memory.h"
#include "stdlib.h"
#include "daemon.h"

#define REMOTE_CONTROL_FRAME_SIZE 18u // 遥控器接收的buffer大小

// 自定义控制器器数据
static CC_ctrl_t cc_ctrl;
static USARTInstance *cc_usart_instance;
static DaemonInstance *cc_daemon_instance;


static uint8_t cc_init_flag = 0; // 遥控器初始化标志位

/**
 * @brief 对sbus_to_rc的简单封装,用于注册到bsp_usart的回调函数中
 *
 */
static void Customer_ControllerRxCallback()
{
    DaemonReload(cc_daemon_instance);         // 先喂狗
    //sbus_to_rc(rc_usart_instance->recv_buff); // 进行协议解析
}

/**
 * @brief 自定义控制器离线的回调函数,注册到守护进程中,串口掉线时调用
 *
 */
static void RCLostCallback(void *id)
{
    // @todo 遥控器丢失的处理
    USARTServiceInit(cc_usart_instance); // 尝试重新启动接收
}

CC_ctrl_t *Customer_Controller_Init(UART_HandleTypeDef *rc_usart_handle)
{
    USART_Init_Config_s conf;
    conf.module_callback = Customer_ControllerRxCallback;
    conf.usart_handle = rc_usart_handle;
    conf.recv_buff_size = REMOTE_CONTROL_FRAME_SIZE;
    cc_usart_instance = USARTRegister(&conf);

    // 进行守护进程的注册,用于定时检查遥控器是否正常工作
    // @todo 当前守护进程直接在这里注册,后续考虑将其封装到遥控器的初始化函数中,即可以让用户决定reload_count的值(是否有必要?)
    Daemon_Init_Config_s daemon_conf = {
        .reload_count = 10, // 100ms未收到数据视为离线,遥控器的接收频率实际上是1000/14Hz(大约70Hz)
        .callback = RCLostCallback,
        .owner_id = NULL, // 只有1个遥控器,不需要owner_id
    };
    cc_daemon_instance = DaemonRegister(&daemon_conf);

    cc_init_flag = 1;
    return &cc_ctrl;
}

void Customer_Controller_Send(uint8_t *tx_data)
{
    USARTSend(cc_usart_instance,(uint8_t *)(&tx_data),sizeof(tx_data),USART_TRANSFER_DMA);
}
